<?php

namespace app\controllers;

use app\models\Category;
use app\models\EntryForm;
use app\models\EventTest;
use app\models\Article;
use Yii;
use yii\web\Controller;
use yii\helpers\Url;
use yii\base\ErrorException;
use yii\web\NotFoundHttpException;
use yii\data\Pagination;
use yii\filters\AccessControl;

class TestController extends Controller
{
    public function behaviors()
    {
        return [
            'Time' => [
                'class' => 'app\filters\TimeFilter',
                'only' => ['date-picker','index'],//使用路由访问的方式，注意大小写中间的-
            ],
            //表示允许已认证用户访问create和update动作，拒绝其他用户访问
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['create', 'update'],
                'rules' => [
                    // 允许认证用户
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                    // 默认禁止其他用户
                ],
            ],
        ];
    }


     //public $layout = "test";//如果不写默认用layouts下面的main.php

    function actionDatePicker()
    {
        return $this->renderPartial("DatePicker");
    }

    function actionIndex()
    {
//        $request=Yii::$app->request;
//        $id=$request->get('id');
//        $sql="select * from article where id=:id";
//        $r=Article::findBysql($sql,[':id'=>$id])->all();
//        dd($r);
//        获取全部数据
//        $data=Article::find()->all();
//        查询单条数据id=5
//        $data=Article::find()->where(['id'=>'5'])->all();
//        id>3的数据
//        $data=Article::find()->where(['>','id',3])->all();
//        id>2,id<5  id:2-5之间的
//        $data=Article::find()->where(['between','id',2,5])->all();
//        title like 111
//        $data=Article::find()->where(['like','title',"111"])->all();
//        查询单条数据id=5  one()方法返回的是个对象，all()方法返回的是个大数组里面为对象
//        $data=Article::find()->where(['id'=>'5'])->one();
//        查询一条数据  id=5的，因为id为主键
//        $data=Article::findOne(5);
//        查询多条数据  id=3,4,5的，因为id为主键
//        $data=Article::findAll([3,4,5]);

//        从数据库取出来的是一个个的对象，为了节省内存常常需要用asArray()方法转换成为数组。
//        $data=Article::find()->asArray()->all();
//
//        两条两条的取，输出结果为2-2-1-
//        foreach(Article::find()->batch(2) as $article){
//            echo count($article),'-';
//        }

//        foreach(Article::find()->batch(2) as $article){
//            $data[] = $article;
//        }
//
//        dd($data);

//        添加记录
//        $article = new Article();
//        $article->title="这是title";
//        $article->num="7";
//        插入有两种方式，一种是insert，另一种是save
//        $data = $article->insert();
//        $data = $article->save();
//        插入完称以后，可以通过attributes来获取该记录的相关内容
//        $id = $article->attributes['id'];
//        dd($id);
//
//        修改记录
//        $article = Article::findOne(9);
//        $article->title="这是save修改的标题";
//        $article->num="10";
//        $date=$article->update();
//        $date=$article->save();
//
//
//        修改查看次数  返回的是受影响的条数
//
//        下面的语句，为,num=num+1,id=id+8
//        $data=Article::updateAllCounters(['num'=>1,'id'=>8]);
//        $data=Article::updateAllCounters(['num'=>1],['id'=>8]);


        //删除单条数据
//        $article = Article::findOne(18);
//        $article = Article::find()->where(['id'=>17])->one();
//        $data=$article->delete();

        //要是用all方法，返回的是，一个二维数组，里面是对象，而delete操纵的是对象
//        $article = Article::find()->where(['id'=>16])->all();
//        $data=$article[0]->delete();
//        $data=Article::deleteAll(['id'=>13]);
        //占位符
//        $data=Article::deleteAll('id=:id',[':id'=>13]);
//        $data=Article::deleteAll('id>:id',[':id'=>13]);

        //删除id>13 num<100的所有数据
//        $data=Article::deleteAll('id>:id And num<:num',[':id'=>13,':num'=>100]);
//        dd($data);

        //一对多的关联查询
//        $category=Category::findOne(2);
//        $articles = Article::find()->where(['cate_id'=>$category->attributes['id']])->all();
        //hasMany('模型的完整命名空间',[关联字段]) 注：关联字段中，比如本例的cate_id是Article里面的后面的id是category里面的
//        $articles = $category->hasMany('app\models\Article',['cate_id'=>'id'])->all();
        //返回模型的完整命名空间
//        dd(Article::className());
//        $articles = $category->hasMany(Article::className(),['cate_id'=>'id'])->all();

//        $articles = $category->getArticles();

        //通过属性的方式
//        $articles = $category->articles;
//        dd($articles);


        //--------一对一----------------
        //通过文章查询分类
//        $article = Article::find()->where(['id'=>4])->asArray()->one();
//        $article = Article::findOne(1);
//        $article = $article->attributes['title'];

//        $article = Article::findOne(1);
//        $category=$article->hasOne('app\models\Category',['id'=>'cate_id'])->all();
//        $category=$article->category;


//        $articles=Article::find()->all();
//
//        foreach($articles as $article){
//            echo $article->attributes['title'];
//            $category[]=$article->category;
//        }
//        dd($category);

        //with方法只用了一条sql语句join
//        $articles = Article::find()->with("category")->all();
//        $articles = Article::find()->with("category")->asArray()->all();
//        foreach ($articles as $value) {
//            echo $value['id'] . "--" . $value['category']['id'] . "<br>";
//        }
        $articles = Article::find()->where(['id'=>1, 'num'=>1])->one();
        dd($articles->attributes['title']);


        return $this->renderPartial("index");//不加载布局文件
    }

    function actionAbout()
    {
        $str = "Hello!<script>alert(4)</script>";
        return $this->render("about",['str'=>$str]);//加载布局文件
    }

    function actionClassmap()
    {
        //类的映射表 用于提升类的加载速度
        \Yii::$classMap['app\models\Article'] = 'D:\wampserver\www\Yii\yiitest\basic\models\Article.php';
        $article = new Article();
        dd(\Yii::$classMap);
    }

    function actionEntry()
    {

        $model = new EntryForm();
        Yii::$app->request->isPost();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {

            return $this->render('entry-confirm', ['model' => $model]);
        } else {
            return $this->render('entry', ['model' => $model]);
        }

    }

    //url
    function actionUrl()
    {
        //相对的URL
        //post/update?id=100
        ///Yii/yiitest/basic/web/index.php?r=post%2Fupdate&id=100
        echo \Yii::$app->urlManager->createUrl(['post/update', 'id' => '100']) . "<br>";

        //url助手类，前面要use yii\helpers\Url;
        p(Url::to());//本身的URL地址
        p(Url::toRoute('entry'));//相同控制器的不同方法间的跳转
        p(Url::toRoute(['entry', 'id' => '100']));//相同控制器的不同方法间的跳转 带参数
        p(Url::toRoute(['site/index', 'id' => '100']));//相同模块，不同控制器 带参数
        p(Url::toRoute(['/site/index', 'id' => '100']));//绝对地址前面加/

        Yii::setAlias('@google', 'http://google.com');//设置别名
        p(Url::to('@google'));//引用别名
    }

    //错误处理
    function actionError()
    {
//        try{
//            10/0;
//            echo "222";
//        }catch (ErrorException $e) {
//            echo "333";
////             var_dump(Yii::warning("Tried dividing by zero."));
//            $exception = \Yii::$app->errorHandler->exception;
//            var_dump($exception);
//        }
        try {
            10 / 0;
        } catch (ErrorException $e) {
            Yii::warning("Division by zero.");
            //dd($e);
        }

    }

    //组件
    function actionZujian()
    {
        return $this->render("Zujian");
    }

    function actionSession()
    {
        $session = Yii::$app->session;
        $session->open();//开启session
        p($session->isActive);//判断session是否开启
        //设置session
        $session->set("username", "ysy");
        //读取session
        p($session->get("username"));
        //检测session变量是否存在
        p($session->has('username'));
        //获取session_id
        p($session->getId());
        //session到期时间，默认为1440s，在php.ini中session.gc_maxlifetime修改
        p($session->getTimeout());
        //获取被创建的session的个数
        p($session->count());
        //清空单个session,返回的是被清空的session值
        //p($session->remove("username"));
        //清空所有的session值，遍历，unset方法，没有返回值
        //p($session->removeAll());

        //$session->setFlash("pwd","123456");
        dd($session->getFlash("pwd"));
        //dd($session->getAllFlashes());
        // 关闭session
        //$session->close();
        // 销毁session中所有已注册的数据
        //$session->destroy();
    }

    //数据库
    function actionDbtest()
    {

//        $posts = Yii::$app->db->createCommand('SELECT * FROM article')
//            ->queryAll();
//        dd($posts);

//        $post = Yii::$app->db->createCommand('SELECT * FROM article WHERE id=1')
//            ->queryOne();
//        dd($post);
        //返回数据表中一列的值
//        $titles = Yii::$app->db->createCommand('SELECT title FROM article')
//            ->queryColumn();
//        dd($titles);
        //返回数据条数
//        $count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM article')
//            ->queryScalar();
//        dd($count);
        //注：为了保持精度，从数据库中取出的数据都表示为字符串，即使相应的数据库列类型是数值的。

        //用绑定参数的方法防止sql注入
//        $post = Yii::$app->db->createCommand('SELECT * FROM article WHERE id=:id AND title=:title')
//            ->bindValue(':id', 7)
//            ->bindValue(':title', "人工智能")
//            ->queryOne();
//        dd($post);

        // executes this SQL for MySQL: SELECT COUNT(`id`) FROM `employee`
//        $count = Yii::$app->db->createCommand("SELECT COUNT(id) FROM {{article}}")
//            ->queryScalar();
//        dd($count);

        //获取表信息
//        $table = Yii::$app->db->getTableSchema('article');
//        dd($table);
    }

    function actionQueryBuilder()
    {
//        $rows = (new \yii\db\Query())
//            ->select(['title', 'num'])
//            ->from('article')
//            //->where(['last_name' => 'Smith'])
//            ->limit(10)
//            ->all();
//        dd($rows);

        //slect * from article
//        $query=new \yii\db\Query();
//        dd($query->from('article')->all());

        /************************绑定参数**********************/
//        $query=new \yii\db\Query();
//        $res=$query->from('article')->where('id=:id')
//            ->addParams([':id' => '1'])->one();
//        dd($res);

        /************************操作符格式**********************/
        //select * from article where id between 1 and 10
//        $query=new \yii\db\Query();
//        $res=$query->from('article')->where(['between','id',1,10])->all();
//        dd($res);

        //select * from article where id > 10
//        $query=new \yii\db\Query();
//        $res=$query->from('article')->where(['>','id',10])->all();
//        dd($res);

        /******************************附加条件andWhere orWhere******************************/
        //可以使用 yii\db\Query::andWhere() 或者 yii\db\Query::orWhere() 在原有条件的基础上 附加额外的条件。
        //可以多次调用这些方法来分别追加不同的条件。
//        $search = 'title';
//        $query=new \yii\db\Query();
//        $res1=$query->from('article')->where(['>','id',11])->all();//这里可以去掉all
        //如果search不为空，则追加一个条件，相当于，where id>11 and title like %$search%
//        if (!empty($search)) {
//            $res2=$query->andWhere(['like', 'title', $search])->all();
//        }
//        p($res1);
//        dd($res2);

        /********过滤条件,当where条件来自于用户输入时，如果条件为空，则忽略掉对应的搜索条件********/
        //当title来自于用户输入时
        //下面这条查出来的是title为这是title的文章
//        $query=new \yii\db\Query();
//        $title='这是title';
//        $res=$query->from('article')->filterWhere([
//            'title' => $title,
//        ])->all();
//        dd($res);
        //而下面这条查出来的是所有的
//        $query=new \yii\db\Query();
//        $title='';
//        $res=$query->from('article')->filterWhere([
//            'title' => $title,
//        ])->all();
//        dd($res);

        //注：此方法中当一个值为 null、空数组、空字符串或者一个只包含空白字符时，那么它将被判定为空值。

        /********追加过滤条件******************/
        //类似于andWhere orWhere可以使用andFilterWhere orFilterWhere

        /***********************orderBy子句***************/
//        $query = new \yii\db\Query();
        //如果仅包含一些简单的字段，可以用子串来声明它
//        $res=$query->from("article")->orderBy("id desc")->all();
        //如果包含DB表达式，应该用如下这种，数组的方式
//        $res=$query->from("article")->orderBy([
//            'id'=>SORT_DESC,//SORT_DESC为PHP常量
//        ])->all();
//        dd($res);
        /*你可以调用 [yii\db\Query::addOrderBy()|addOrderBy()]] 来为 ORDER BY 片断添加额外的子句。 例如，
        $query->orderBy('id ASC')
            ->addOrderBy('name DESC');
        */

        /***********limit offset******************/
        //equls  select * from article limit 5,1
//        $query = new \yii\db\Query();
//        $res=$query->from("article")->limit(1)->offset(5)->all();
//        dd($res);
        //如果指定了一个无效的limit比如-1，那么它将会被自动忽略

        /***************union*********************/


        /*****************join*****************/



        /***********************查询方法********************/
        /*
         * yii\db\Query 提供了一整套的用于不同查询目的的方法。
         * yii\db\Query::all(): 将返回一个由行组成的数组，每一行是一个由名称和值构成的关联数组（译者注：省略键的数组称为索引数组）。
         * yii\db\Query::one(): 返回结果集的第一行。
         * yii\db\Query::column(): 返回结果集的第一列。
         * yii\db\Query::scalar(): 返回结果集的第一行第一列的标量值。
         * yii\db\Query::exists(): 返回一个表示该查询是否包结果集的值。
         * yii\db\Query::count(): 返回 COUNT 查询的结果。
         *   其它集合查询方法: 包括 yii\db\Query::sum(), yii\db\Query::average(), yii\db\Query::max(), yii\db\Query::min() 等. $q 是一个必选参数， 既可以是一个字段名称，又可以是一个 DB 表达式。
        */
        //examples
//        $rows = (new \yii\db\Query())
//            ->select(['title', 'num'])
//            ->from('article')
//            ->all();
//        dd($rows);
//        $rows = (new \yii\db\Query())
//            ->select(['title', 'num'])
//            ->from('article')
//            ->column();//此时返回的仅有title

//        $rows = (new \yii\db\Query())
//            ->select(['title', 'num'])
//            ->from('article')
//            ->count();//统计个数
        //统计个数也可以写成如下这种形式
//        $rows = (new \yii\db\Query())
//            ->select("count(*)")
//            ->from('article')
//            ->scalar();//统计个数
//        dd($rows);
        /**
         * 注意：yii\db\Query::one() 方法只返回查询结果当中的第一条数据， 条件语句中不会加上 LIMIT 1 条件。
         * 如果你清楚的知道查询将会只返回一行或几行数据 （例如， 如果你是通过某些主键来查询的），
         * 这很好也提倡这样做。但是，如果查询结果 有机会返回大量的数据时，那么你应该显示调用 limit(1) 方法，
         * 以改善性能。 例如， (new \yii\db\Query())->from('user')->limit(1)->one()。
         */

        /**
         * 当你调用 yii\db\Query 当中的一个查询方法的时候，实际上内在的运作机制如下：
         * 在当前 yii\db\Query 的构造基础之上，调用 yii\db\QueryBuilder 来生成一条 SQL 语句；
         * 利用生成的 SQL 语句创建一个 yii\db\Command 对象；
         * 调用 yii\db\Command 的查询方法（例如，queryAll()）来执行这条 SQL 语句，并检索数据。
         */

//        $command = (new \yii\db\Query())
//            ->select(['title', 'num'])
//            ->from('article')
//            ->where(['>','num',10])
//            ->limit(10)
//            ->createCommand();
        // 打印 SQL 语句  SELECT `title`, `num` FROM `article` WHERE `num` > :qp0 LIMIT 10
       // echo $command->sql;
        // 打印被绑定的参数   Array ( [:qp0] => 10 )
       // print_r($command->params);

        // 返回查询结果的所有行
        //$rows = $command->queryAll();
        //dd($rows);

        /*************************索引查询结果*************************/
        //返回以id为索引的数组，注查询结果中必须包含column id
//        $query = (new \yii\db\Query())
//            ->from('article')
//            ->limit(5)
//            ->indexBy('id')
//            ->all();
//        dd($query);

        //表达式作为索引
//        $query = (new \yii\db\Query())
//            ->from('article')
//            ->indexBy(function ($row) {
//                return $row['id'] . $row['addtime'];
//            })->all();
//        dd($query);
        //这个方法，在数据已经从数据库取出以后才执行，所以，必须用包含的column

        /************************批处理***************/
//        $query = (new \yii\db\Query())
//            ->from('article');
        //batch()的默认值为100
//        foreach($query->batch(5) as $article){
//            $data[]=$article;
//        }
//        dd($data);//三维数组
        //each()返回的是一个一维数组
//        foreach ($query->each() as $article) {
//            // $article 指代的是用户表当中的其中一行数据
//            p($article);
//        }

        /********************连接查询**********************/
//        $query = (new \yii\db\Query())
//            ->from(['article','category'])
//            ->where("article.cate_id=category.id")
//            ->all();
//        dd($query);

    }

    function actionDataFormat()
    {
        $formatter = \Yii::$app->formatter;
        //output: Jul 26, 2016
        echo $formatter->asDate('2016-07-26','medium');
        //output: July 26, 2016
        echo $formatter->asDate('2016-07-26','long');
        //output: 7/26/16
        echo $formatter->asDate('2016-07-26','short');
        echo "<br><br>";
        // output: 12.50%  注第二个参数为保留的百分号后的位数
        //asPercent的源码机制，用is_numeric()来判断是否为数字或数字字符串，然后乘100
        //然后再用php number_format()函数来格式化数字，千分隔用",",小数点用"."(4舍5入)
        echo $formatter->asPercent(0.125, 2);
        echo "<br><br>";
        // output: <a href="mailto:cebe@example.com">cebe@example.com</a>
        echo $formatter->asEmail('cebe@example.com');

        echo "<br><br>";
        // output: Yes
        echo $formatter->asBoolean(true);
        echo "<br>";
        // it also handles display of null values:
        //output: (not set)
        echo $formatter->asBoolean(null);

        echo "<br><br>";

        /**
         * 上述方法都是asXyz()类型的，你也可以用一个通用的方法yii\i18n\Formatter::format()
         * it is commonly used by widgets like yii\grid\GridView and yii\widgets\DetailView. For example,
         */

        // output: January 1, 2014
        echo Yii::$app->formatter->format('2014-01-01', 'date');

        // you can also use an array to specify parameters for the format method:
        // `2` is the value for the $decimals parameter of the asPercent()-method.
        // output: 12.50%
        echo Yii::$app->formatter->format(0.125, ['percent', 2]);
        //output: Yes
        echo Yii::$app->formatter->format('true', 'boolean');
        // output: <a href="mailto:cebe@example.com">cebe@example.com</a>
        echo Yii::$app->formatter->format('cebe@example.com', 'email');

        /**
         *注：如果你想将用户输入的值转换成机器可读的，或者仅仅转换一个日期格式，格式化组件 is not the right tool for that。
         * 可以选用yii\validators\DateValidator and yii\validators\NumberValidator，
         * 如果仅仅转化日期格式，PHP date()-function is enough
         */


        /**
         * 我们可以在application configuration里面定制格式化规则，例如：
         * return [
         *      'components' => [
         *          'formatter' => [
         *          'dateFormat' => 'dd.MM.yyyy',
         *          'decimalSeparator' => ',',
         *          'thousandSeparator' => ' ',
         *          'currencyCode' => 'EUR',
         *          ],
         *      ],
         * ];
         */
        echo "<br><br>";

        /*****************************与时间日期相关的输出格式**********************/
        //output: Jul 26, 2016
        echo $formatter->asDate(time());
        //output: 3:24:48 PM
        echo $formatter->asTime(time());
        //output: Jul 26, 2016 3:25:29 PM
        echo $formatter->asDatetime(time());
        //output: an hour ago
        echo $formatter->asRelativeTime("1 hour ago");
        //output: 46 years ago
        echo $formatter->asRelativeTime("1970-01-01");
        echo "<br>";
        //output: 1 minute, 1 second
        echo $formatter->asDuration(61);

        // ICU format
        echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2016-07-26

        // PHP date()-format
        echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2016-07-26

        /**
         *
         * short: will output 06/10/2014 for date and 15:58 for time;
         * medium: will output 6 Oct 2014 and 15:58:42;
         * long: will output 6 October 2014 and 15:58:42 GMT;
         * full: will output Monday, 6 October 2014 and 15:58:42 GMT.
         *
         */

        echo "<br>";echo "<br>";
        /***************************时区****************************/
        /**
         * 在\yii\i18n\Formatter.php中默认时区为UTC
         * public $defaultTimeZone = 'UTC';
         */
        // formatting a UNIX timestamp as a time
        //output: 8:41:00 PM
        echo Yii::$app->formatter->asTime(1412599260);

        //output: 8:41:00 PM
        echo Yii::$app->formatter->asTime('2014-10-06 12:41:00');

        // formatting a datetime string (in CEST) as a time
        echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 PRC'); //2:41:00 PM

        /******************数字格式化************************/
        echo "<br><br>";
        //output: 4
        echo $formatter->asInteger(4.2);
        //output: 12,345.68
        /*
         * asDecimal和asPercent处理方式几乎类似，
         * 都是用php number_format()来格式化
         */
        echo $formatter->asDecimal(12345.6789);
        //output: 12%
        echo $formatter->asPercent(0.12);
        //以上两个方法，都可以添加第二个参数，用来指定小数点后面的位数asDecimal默认为2，asPercent默认为0

        /**
         * 还有如下方法可以参考
         *  yii\i18n\Formatter::asScientific(): the value is formatted as a number in scientific format e.g. 4.2E4. (科学计数法)
         *  yii\i18n\Formatter::asCurrency(): the value is formatted as a currency value e.g. £420.00.
         * Note that for this function to work properly, the locale needs to include a country part e.g. en_GB or en_US
         * because language only would be ambiguous in this case.(货币)
         *  yii\i18n\Formatter::asSize(): the value that is a number of bytes is formatted as a human readable size e.g. 410 kibibytes.
         *  yii\i18n\Formatter::asShortSize(): is the short version of yii\i18n\Formatter::asSize(), e.g. 410 KiB.
         */


        /*********************Localizing Data Format***********/
        Yii::$app->formatter->locale = 'en-US';
        echo Yii::$app->formatter->asDate('2014-01-01','full'); // output: Jan 1, 2014
        Yii::$app->formatter->locale = 'zh-CN';
        echo Yii::$app->formatter->asDate('2014-01-01','full');
        //上述两个输出和权威指南不符合，so I don't Know Why
        //查阅资料，了解到intl extension is not installed, the data will not be localized.
        //PHP intl 是国际化扩展，是ICU 库的一个包装器。
        //Windows下的扩展方式就是去掉extension=php_intl.dll前面的分号重启Apache即可
        //则上面的运行结果为Wednesday, January 1, 2014    2014年1月1日星期三
        echo "<br><br>";

        // before year 1901 or after 2038, they will not be localized on 32-bit systems
        var_dump(mktime(0,0,0,2,21,2055));//output: false

        $date = '2090-10-01';
        echo '<p>时间溢出: ', date('Y-m-d H:i', strtotime($date)), '<p>';//output: 时间溢出: 1970-01-01 08:00
        /*********************注：Yii要想调用PHP本身的类，需要在前面加个\***********/
        $datetime = new \DateTime();
        var_dump($datetime);
        $password="123";
//        $hash = Yii::$app->getSecurity()->generatePasswordHash("123456");
//        p($hash);
//        dd(crypt("123456",$hash));
//        if (Yii::$app->getSecurity()->validatePassword($password, $hash))
        // $diff|= () 等价于 $diff = $diff | ()  取或  此处，一旦为结果为1，则不可能置零
        // ^ 为按位异或，相同为0，不同非0
        //如果按位取或之后，$diff仍然为0，则说明两密码绝对相等

//        dd(mb_strlen("107网站","8bit"));//output: 5
//        dd(mb_strlen("107网站","8bit"));//output: 9

        echo "<br>";
        echo crypt("123","107lab")."<br>";//output: 10xYSRmiXNIME
        echo crypt("123","10xYSRmiXNIME");//output: 10xYSRmiXNIME

    }

    /**
     * 分页
     */
    function actionPagination()
    {
        $query=Article::find();
//        $query=Article::find()->where(['id'=>1]);
        $count = $query->count();
        $pagination = new Pagination(['totalCount' => $count,'defaultPageSize'=>'5',]);
//        $pagination->defaultPageSize=5;
        // limit the query using the pagination and retrieve the articles
        $articles = $query->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('pagination', [
            'articles' => $articles,
            'pagination' => $pagination,
        ]);

    }

    /**
     * 事件
     *
     * @return null
     */
    function actionEvent()
    {
        $etest=new EventTest();
        //public function on($name, $handler, $data = null, $append = true)
        $this->on("1#",'hello','111'); //全局函数,定义在入口文件index.php中
        $this->trigger("1#");//触发事件

        $this->on("2#",[$etest,'say_bye'],"bye");//对象
        $this->trigger("2#");
        echo "222"."<br>";

        $this->on("3#",['app\models\EventTest','say_hello'],"hello");//类 类中的方法必须是static静态的
        $this->trigger("3#");

        $this->on("4#",function($event){
            echo $event->data;
        },"444",false);//匿名函数
        $this->trigger("4#");

        echo "<br>";
        /**
         * 当一个事件附加了多个处理器的时候，通过调用$event->handled=true可以停止以后的调用
         * 如果设置第四个参数为false，则可以将调用顺序放到第一个，如果多个为false，则倒着来
         * 注：事件处理器的调用顺序默认为附加顺序
         */
        $this->on("5#",function($event){
            echo $event->data."<br>";
        },"555");//匿名函数
        $this->on("5#",function($event){
            echo $event->data."<br>";
           // $event->handled = true;//停止以后的调用
        },"556");//匿名函数
        $this->on("5#",function($event){
            echo $event->data."<br>";
        },"557",false);//匿名函数

        $this->trigger("5#");

    }

    /**
     * Csrf 测试
     *
     * @return null
     */
    function actionCsrf()
    {
        if (Yii::$app->request->isPost) {
            echo Yii::$app->request->post("content");
        } else {
            $csrfToken = Yii::$app->request->csrfToken;
            return $this->renderPartial("csrf", ['csrfToken' => $csrfToken]);
        }
    }

    /**
     * 调用子模块
     *
     * @return null
     */
    public function actionModule()
    {
        //获取子模块
        $article = Yii::$app->getModule('article');
        //调用子模块的操作
        $article->runAction('default/index');
    }

    /**
     * 通过yii-debug来检测程序的运行时间
     *
     * @return null
     */
    public function actionProfiling()
    {
        Yii::beginProfile('profile1');
        echo "hello world";
        Yii::endProfile('profile1');
    }

    /**
     * 场景
     *
     * @return null
     */
    public function actionScenarios()
    {
        $article = new Article();
        $article->scenario = 'scenario1';//使用场景，此场景中有id和title字段，可以赋值
        $testData = [
          'data'=>['id'=>33, 'title'=>'hello world']
        ];
        $article->load($testData, 'data');
        //如果不用场景此处为空
        var_dump($article->id);//3
        var_dump($article->title);//hello world
    }

    /**
     * Topmenu 小部件
     *
     * @return string
     */
    public function actionMenu()
    {
        return $this->renderPartial('menu');
    }


}
